package cn.com.zetatech.loader.common.service;

import cn.com.zetatech.loader.common.message.ResolverMessage;

import java.util.Map;

/**
 * @author zhengbs
 */
public interface ResolverStateControlService {

    /**
     * 开启任务状态监控
     * @param resolverMessage
     * @param startTimeMillis 解析任务开始时间
     */
    void initJobMonitor(ResolverMessage resolverMessage, long startTimeMillis);

    /**
     * 开启文件解析状态监控
     * @param resolverMessage
     * @param remoteFileId  远程文件ID
     * @param fileId 解析文件id
     * @param fileInfoMap  文件详细信息
     * @param startTimeMillis 解析任务开始时间
     */
    long initFileMonitor(ResolverMessage resolverMessage, String remoteFileId, String fileId, Map<String, Object> fileInfoMap, long startTimeMillis);

    /**
     * 数据待入库时
     * @param topic
     * @param partition
     * @param offset
     * @param fileId
     */
    void dataStoreHandle(String topic, int partition, long offset, String fileId);

    /**
     * 数据已入库时
     * @param topic
     * @param partition
     * @param offset
     * @param fileId
     */
    void dataStoreSuccessHandle(String topic, int partition, long offset, String fileId);

    /**
     * 文件读取完成时
     * @param fileId 解析文件id
     * @param flagMsg 传递一些后续操作可用的信息
     */
    void completedHandle(String fileId, String flagMsg);

    /**
     * 当解析出错时
     * @param fileId 解析文件id
     * @param errorMsg 错误信息
     * @param completed 是否解析完成
     * @param flagMsg 主键信息，用于解析失败数据回滚
     */
    void errorHandle(String fileId, String errorMsg, boolean completed, String flagMsg);

    /**
     * 关联文件处理
     * @param fileId
     * @param fileRemotePath
     * @param fileLocalPath
     */
    void relatedFilesHandle(String fileId, String fileRemotePath, String fileLocalPath);

    /**
     * 检查文件解析是否发生错误
     * @param fileId
     * @return
     */
    boolean checkHasError(String fileId);
}
